package com.water.app;

import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class RedisUtils {
    private static final Logger log = LoggerFactory.getLogger(RedisUtils.class);
    @Resource
    private StringRedisTemplate stringRedisTemplate;

//    //获取redis里面的特定商品集合
//    @Transactional(rollbackFor = Exception.class)
//    public Set<Goods>  selectGoodsAche(String type,String shop) throws DeleteRedisAcheException {
//        Set<Goods> goodsSet=new HashSet<>();
//        ScanOptions scanOptions = ScanOptions.scanOptions().
//                match("taobao:type:" + type + ":shop:" + shop + ":goods:*").
//                count(50).
//                build();
//        try(Cursor<byte[]> cursor = stringRedisTemplate.getConnectionFactory().getConnection().scan(scanOptions)){
//            while (cursor.hasNext()){
//                byte[] next = cursor.next();
//                String key=new String(next, StandardCharsets.UTF_8);
//                String goodsStr = stringRedisTemplate.opsForValue().get(key);
//                if(goodsStr==null||goodsStr.isEmpty()){
//                    continue;
//                }else {
//                    try {
//                        Goods goods = JSONUtil.toBean(goodsStr, Goods.class);
//                        goodsSet.add(goods);
//                    } catch (Exception e) {
//                        log.info("获取失败");
//                        throw new DeleteRedisAcheException("添加缓存失败，停止添加缓存");
//                    }
//                }
//            }
//        }catch (Exception e){
//            log.info("系统异常");
//            throw new DeleteRedisAcheException("添加缓存失败，停止添加缓存");
//        }
//        return goodsSet;
//    }
//
//
//    //删除redis里面的特定商品
//    @Transactional(rollbackFor = Exception.class)
//    public boolean deleteGoodsAche(String type,String shop){
//        Set<Goods> goodsSet=new HashSet<>();
//        ScanOptions scanOptions = ScanOptions.scanOptions().
//                match("taobao:type:" + type + "shop:" + shop + "goods:*").
//                count(50).
//                build();
//        try(Cursor<byte[]> cursor = stringRedisTemplate.getConnectionFactory().getConnection().scan(scanOptions)){
//            while (cursor.hasNext()){
//                byte[] next = cursor.next();
//                String key=new String(next, StandardCharsets.UTF_8);
//                String goodsStr = stringRedisTemplate.opsForValue().get(key);
//                if(goodsStr==null||goodsStr.isEmpty()){
//                    continue;
//                }else {
//                    try {
//                        Boolean delete = stringRedisTemplate.delete(key);
//                        if(Boolean.TRUE.equals(delete)){
//                            continue;
//                        }else {
//                            throw new DeleteRedisAcheException("删除缓存失败，停止删除缓存");
//                        }
//                    } catch (Exception e) {
//                        log.info("删除失败");
//                    }
//                }
//            }
//        }catch (Exception e){
//            log.info("系统异常");
//            throw e;
//        }
//        return true;
//    }
    /**
     * 自定义工具方法：扫描符合指定通配符模式的Redis Key，且只保留List类型（队列）
     * @param pattern 通配符模式（如 chat:private:user1:1001:user2:*）
     * @return 符合条件的List类型Key列表
     */
    public List<String> scanKeysByPattern(String pattern) {
        List<String> resultKeys = new ArrayList<>();

        // 1. 配置Scan选项（原生API：ScanOptions）
        ScanOptions scanOptions = ScanOptions.scanOptions()
                .match(pattern) // 通配符匹配
                .count(100) // 每次迭代最多返回100个Key（可调整，避免阻塞）
                .build();

        // 2. 执行scan迭代（原生API：stringRedisTemplate.scan）
        // 注意：这里是Spring Data Redis的原生Cursor，需要迭代遍历
        Cursor<String> cursor = stringRedisTemplate.scan(scanOptions);
        while (cursor.hasNext()) { // 游标有下一个Key时继续
            String key = cursor.next(); // 获取当前Key（原生API：cursor.next()）

            // 3. 过滤：只保留List类型的Key（队列）（原生API：stringRedisTemplate.type(key)）
            // RedisType.LIST.code() 返回字符串"list"，equalsIgnoreCase忽略大小写
            if ("list".equalsIgnoreCase(stringRedisTemplate.type(key).code())) {
                resultKeys.add(key); // 符合条件的Key加入结果集
            }
        }

        return resultKeys;
    }
}
